package com.taichuan.selfcheck.ui.activity.base;


import android.content.Intent;
import android.os.Bundle;
import android.view.MotionEvent;
import com.orhanobut.logger.Logger;
import com.taichuan.mvp.activity.BaseActivity;
import com.taichuan.mvp.base.MvpBaseInterface;
import com.taichuan.mvp.base.MvpBasePresenter;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by CamelLuo on 2018/10/19.
 * 实现了MVP架构 的 Activity 应用层抽象基类
 * 请在该类中实现与项目相关的公用方法、流程
 */
public abstract class AppBaseActivity<V extends MvpBaseInterface, P extends MvpBasePresenter<V>> extends BaseActivity<V, P> {
    public final String TAG = this.getClass().getSimpleName();
    private static final String AUTO_FINISH_TAG = "AutoFinish";
    private static final boolean IS_DEBUG_AUTO_FINISH = true;

    /**
     * 定义一个变量用于控制 页面自动超时结束的时间 默认为30秒
     */
    private static final int DEFAULT_AUTO_FINISH_PAGE_TIME = 30;

    /**
     * 定义一个变量用于打开Activity时附带请求码 用于响应请求上一级页面进行 页面自动超时关闭操作
     */
    protected static final int REQUEST_CODE_ON_LAYER_OF_PAGE_AUTO_FINISH = 501;
    /**
     * 定义一个变量用于 用于请求上一级页面进行 页面自动超时关闭操作
     */
    protected static final int RESULT_CODE_ON_LAYER_OF_PAGE_AUTO_FINISH = 101;

    /**
     * 定义一个变量用于进行页面自动超时倒计时计数
     */
    private int pageCountdownTime = 0;
    /**
     * 定义一个变量用于控制当前 页面自动超时定时器是否处于暂停状态
     */
    private boolean isPauseTimer = false;
    /**
     * 页面自动超时定时器
     */
    private Timer autoFinishTimer = null;
    /**
     * 页面自动超时定时器任务
     */
    private AutoFinishTimerTask autoFinishTimerTask = null;

    //通过判断触发了按键事件接口还是触摸事件接口来判断当前设备的类型是触屏还是按键
    protected boolean isTouchDevice = true;

    public boolean getIsTouchDevice(){
        return isTouchDevice;
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //初始化并启动页面超时结束定时器
        if (isAllowAutoFinishActivity()){
            initAutoFinishTimer();
            startAutoFinishTimer();
        }else {
            debugAutoFinishLog(" 页面不执行页面超时结束定时器");
        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        debugAutoFinishLog( "正在执行 onStart() 方法");
    }

    @Override
    protected void onResume() {
        super.onResume();
        debugAutoFinishLog( "正在执行 onResume() 方法");
        //恢复页面超时结束定时器工作状态
        resumeAutoFinishTimer();

    }

    @Override
    protected void onPause() {
        super.onPause();
        debugAutoFinishLog( "正在执行 onPause() 方法");
    }

    @Override
    protected void onStop() {
        super.onStop();
        debugAutoFinishLog( "正在执行 onStop() 方法");
        //暂停页面超时结束定时器工作状态
        pauseAutoFinishTimer();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        debugAutoFinishLog( "正在执行 onDestroy() 方法");
        //注销页面页面超时结束定时器
        destoryAutoFinishTimer();
    }

    //////////////////////////////////////////////////////////页面超时结束定时器相关//////////////////////////////////////////////////////
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        isTouchDevice = true;
        if (isAllowAutoFinishActivity()){
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //有按下动作时暂停页面超时结束定时器
                    pauseAutoFinishTimer();
                    break;
                case MotionEvent.ACTION_UP:
                    //抬起时恢复页面超时结束定时器
                    resumeAutoFinishTimer();
                    break;
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 定义一个方法用于初始化页面超时自动结束定时器
     */
    protected void initAutoFinishTimer() {
        // 初始化计时器
        autoFinishTimer = new Timer();
        //初始化计时器任务
        autoFinishTimerTask = new AutoFinishTimerTask();
    }

    /**
     * 定义一个方法用于启动页面超时自动结束定时器
     */
    protected void startAutoFinishTimer() {
        // 初始化计时器
        if (autoFinishTimer == null){
            autoFinishTimer = new Timer();
        }
        if (autoFinishTimerTask == null){
            autoFinishTimerTask = new AutoFinishTimerTask();
        }

        if (autoFinishTimer != null){
            autoFinishTimer.schedule(autoFinishTimerTask,1000,1000);
            debugAutoFinishLog(" 页面启动自动超时任务");
        }
    }

    /**
     * 定义一个方法用于暂停页面超时自动结束定时器
     */
    protected void pauseAutoFinishTimer(){
        if (isAllowAutoFinishActivity()){
            pageCountdownTime = 0;
            isPauseTimer = true;
            debugAutoFinishLog(" 页面进入暂停计时状态");
        }
    }

    /**
     * 定义一个方法用于恢复页面超时自动结束定时器
     */
    protected void resumeAutoFinishTimer(){
        if (isAllowAutoFinishActivity()){
            pageCountdownTime = 0;
            isPauseTimer = false;
            debugAutoFinishLog(" 页面恢复计时状态");
        }
    }

    /**
     * 定义一个方法用于注销页面超时自动结束定时器
     */
    protected void destoryAutoFinishTimer() {
        if (isAllowAutoFinishActivity()){
            if (autoFinishTimer != null){
                autoFinishTimer.cancel();
            }

            autoFinishTimer = null;
            autoFinishTimerTask = null;
            debugAutoFinishLog(" 页面注销自动超时任务");
        }
    }

    /**
     * 定义一个内部类用于实现页面自动超时功能
     */
    private class AutoFinishTimerTask extends TimerTask {
        @Override
        public void run() {
            if (isAllowAutoFinishActivity()){
                if (!isPauseTimer){
                    //计时增加
                    pageCountdownTime++;
                    debugAutoFinishLog(" 正在进行页面超时倒计时，当前秒数：  " + pageCountdownTime);
                    if (pageCountdownTime == getAutoFinishTime()){
                        debugAutoFinishLog(" 页面超时,结束页面：  " + pageCountdownTime);
                        //关闭计时器
                        destoryAutoFinishTimer();
                        //交由子类完成是否需要在页面超时自动结束时执行相关逻辑
                        doOnAutoFinishActivity();
                        //通知其上一级页面 执行 页面超时自动结束
                        noticLayerOfActivityAutoFinish();
                        //关闭加载框
                        dismissDialog();
                        //结束页面
                        finish();
                    }
                }
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        debugAutoFinishLog("接收到 onActivityResult  requestCode 为：  " + requestCode + "  resultCode为：  " + resultCode);
        if (requestCode == REQUEST_CODE_ON_LAYER_OF_PAGE_AUTO_FINISH){
            if (resultCode == RESULT_CODE_ON_LAYER_OF_PAGE_AUTO_FINISH){
                debugAutoFinishLog("上级页面收到 自动超时结束请求");
                //交由子类控制是否需要在 自动超时结束前是否需要执行相关操作
                doOnNextLayerAutoFinishActivity();
                //通知其上一级页面 执行 页面超时自动结束
                noticLayerOfActivityAutoFinish();
                finish();
            }
        }
    }

    /**
     * 定义一个方法用于debug打印调试自动超时相关log
     * @param content
     */
    protected void debugAutoFinishLog(String content){
        if (IS_DEBUG_AUTO_FINISH){
            Logger.t(AUTO_FINISH_TAG).i(this.getClass().getSimpleName() + content);
        }
    }

    /**
     * 定义一个方法用于通知 通知其上一级页面 执行 页面超时自动结束
     */
    protected void noticLayerOfActivityAutoFinish(){
        setResult(RESULT_CODE_ON_LAYER_OF_PAGE_AUTO_FINISH);
    }

    /**
     * 定义一个方法用于通知 通知其上一级页面 执行 页面超时自动结束
     */
    protected void startActivityForAutoFinish(Intent intent){
        startActivityForResult(intent,REQUEST_CODE_ON_LAYER_OF_PAGE_AUTO_FINISH);
    }

    /**
     * 定义一个方法用于 里面一级页面执行 页面超时自动结束 后 通知其上一级页面 执行 页面超时自动结束 时 需要完成的事情
     */
    protected void doOnNextLayerAutoFinishActivity(){

    }

    /**
     * 定义一个方法用于设置 页面超时自动结束的时间
     * @return
     */
    protected int getAutoFinishTime(){
        return DEFAULT_AUTO_FINISH_PAGE_TIME;
    }

    /**
     * 定义一个方法用于让按键版设备点击返回键时需要执行的流程
     */
    public void clickBackKey(){

    }

    ////////////////////////////////////////////////////抽象方法相关/////////////////////////////////////////////////////////////////////

    /**
     * 定义一个抽象方法用于是否启动 页面超时自动结束定时器
     * @return 是否允许启动，默认为false
     */
    protected abstract boolean isAllowAutoFinishActivity();

    /**
     * 定义一个抽象方法用于 在执行 页面超时自动结束 时 需要完成的事情
     * @return 是否允许启动，默认为false
     */
    protected abstract void doOnAutoFinishActivity();
}
